package chapter04

import org.apache.spark.sql.{DataFrame, SparkSession}

object DataFrameAPIApp {
  def main(args: Array[String]): Unit = {
    val spark: SparkSession = SparkSession.builder()
      .appName("DataFrameAPIApp")
      .master("local")
      .getOrCreate()


    //隐式转化
    import spark.implicits._

    //  val df: DataFrame = spark.read.json("file:///D:\\JAVApros\\spark_pk\\data\\people.json")

    //    df.printSchema()//查看df的内部结构：列名、列的数据类型、是否可以为空
    //    df.show()//展示出df内部的数据

    //todo... select
    //    df.select("name").show()
    //    df.select($"name").show()

    //todo  过滤
    //    df.filter($"age">21).show()
    //    df.filter("age>21").show()

    //todo 分组聚合
    //   df.groupBy("age").count().show()

    //todo
    // df.select($"name", $"age" + 10 as ("age")).show()

    //todo 使用sql
    //    df.createOrReplaceTempView("df")
    //    spark.sql("select name from df where age>21").show()

    val zips: DataFrame = spark.read.json("file:///D:\\JAVApros\\spark_pk\\data\\zips.json")
   // zips.printSchema()

    //todo show()
    //show（）==>show(20)==>show(numRow,truncate=true)
    //show() loc没展示全发生truncate；only showing top 20 rows
    //  zips.show()
    //zips.show(false)
   // zips.show(10,false)


    // todo: head() take() first()
    // zips.head(3).foreach(println)
    //first、take调用的都是head
    //zips.first()
   // zips.take(5)

    //todo count()
   // val count: Long = zips.count()
   // println(count)

    //todo filter  withColumnRenamed
    //过滤出大于40000  改名
    //zips.select($"_id" as("id"),$"pop").filter(zips.col("pop")>40000).show(10,false)
    //zips.filter(zips.col("pop")>40000).withColumnRenamed("_id","new_id").show(10,false)

    //统计 加州 pop最多的10个 城市名称 及 邮编
    // todo desc是一个内置函数 要导包
    import org.apache.spark.sql.functions._

    //todo $"name"方式可以直接接 as取别名
//    zips.filter(zips.col("state")==="CA")
//        .orderBy(desc("pop"))
//      .select($"_id" as("id"),$"city",$"pop",$"state")
//        .show(10,false)


    zips.createOrReplaceTempView("zips")
    spark.sql(
      """
        |SELECT
        |     _id as id,
        |     city,
        |     pop,
        |     state
        |FROM zips
        |     WHERE state='CA'
        |     ORDER BY pop DESC
        |""".stripMargin).show(10)



    spark.stop()
  }

}
